package com.hsm11;

public class Test {
    //内部类
    //类的组成：属性 方法 构造器 代码块（普通块 静态块 构造块 同步块） 内部类：成员内部类和局部内部类
    //属性
    int age = 10;
    //成员内部类
    public class D{
        String name;
        int age = 20;
        public void Dd(){
            //在成员内部类中，也可以用外部类的方法和属性
            int age = 30;
            System.out.println(age);//结果是30
            System.out.println(this.age);
            System.out.println(Test.this.age);
            a();

        }
    }
    //静态成员内部类
    static class E{
        public void Ee(){
            //这样写不对的，因为static就要找static的内容
            // System.out.println(age);
        }

    }
    //方法
    public void a(){
        System.out.println("这是一个方法a");
        {
            System.out.println("这是一个普通块");
            //局部内部类
            class B{

            }
        }
        //局部内部类
        class A{

        }
        //通过内部类的对象去访问内部类的东西
        D d = new D();
        System.out.println(d.name);
        d.Dd();
    }
    static {
        System.out.println("这是一个静态块，且我比构造器和构造块先执行");
    }
    {
        System.out.println("这是一个构造块，且我比构造器先执行");
    }
    //构造器
   public Test(){
        //局部内部类
        class C{

        }
   }
   public Test(int age){
        this.age = age;
   }
}
class Demo {
    public static void main(String[] args) {
        //创建外部类对象，想用内部类的方法，可以在外部类的方法里创建一个内部类的对象进行使用
        Test t = new Test();
        t.a();
        //创建内部类的对象，分为非静态内部类和静态内部类
        //静态内部类，外部类.内部类
        Test.E e = new Test.E();
        //非静态内部类,属于类的成员，因此要先有个外部类
        Test t1 = new Test();
        //然后再通过外部类.new进行创建
        Test.D d = t1.new D();
    }
}
